# -*- coding: UTF-8 -*-
"""
@Project , trainee
@File    , homeData.py
@IDE     , PyCharm
@Author  , 2607750505@qq.com
@Date    , 2025/6/16 15:26
"""
import json
import pandas as pd
from tools.getDataBase import get_conn  # 导入新的连接对象


def getAllData():
    """
    从数据库中读取所有电影数据，并对某些字段进行格式处理。
    返回处理后的二维列表数据。
    """

    def map_fn(item):
        """
        数据清洗函数，用于处理每条电影记录中的字段。
        主要包括将 None 值替换为默认值、将字符串按逗号分割成列表等操作。
        """
        item = list(item)  # 将元组转为列表，便于后续修改

        # 处理 directors 字段（索引1）
        if item[1] == None:
            item[1] = '无'
        else:
            item[1] = item[1].split(',')  # 按逗号拆分为导演列表

        # 处理 casts 字段（索引4）
        if item[4] == None:
            item[4] = '无'
        else:
            item[4] = item[4].split(',')  # 按逗号拆分为演员列表

        # 处理 types 字段（索引7），如果出错则设为 ['剧情']
        try:
            item[7] = item[7].split(',')
        except Exception as e:
            item[7] = ['剧情']

        # 处理 country 字段（索引8）
        if item[8] == None:
            item[8] = '中国大陆'
        else:
            item[8] = item[8].split(',')  # 拆分为国家/地区列表

        # 处理 lang 字段（索引9）
        if item[9] == None:
            item[9] = '汉语普通话'
        else:
            item[9] = item[9].split(',')  # 拆分为语言列表

        # 处理 star 字段（索引13），假设该字段一定存在
        item[13] = item[13].split(',')  # 拆分为星级标签列表

        # 处理 imgList 字段（索引15），假设该字段一定存在
        item[15] = item[15].split(',')  # 拆分为图片链接列表

        # 注意：原代码中有被注释掉的 json.loads(item[15])，
        # 如果图片链接是以 JSON 格式存储的字符串，应该使用 json.loads 解析。

        return item  # 返回清洗后的单条数据

    # 连接数据库
    conn, cursor = get_conn()

    # 执行 SQL 查询语句：查询 movies 表中所有数据
    cursor.execute('select * from movies')

    # 获取所有查询结果
    allData = cursor.fetchall()

    # 使用 map 函数对每条数据应用 map_fn 清洗函数
    allData = list(map(map_fn, list(allData)))

    # 返回清洗后的二维列表数据
    return allData


df = pd.DataFrame(getAllData(), columns=[
    'id',
    'directors',
    'rate',
    'title',
    'casts',
    'cover',
    'year',
    'types',
    'country',
    'lang',
    'time',
    'movieTime',
    'commentLen',
    'star',
    'summary',
    # 'comments',
    'imgList',
    'detailLink'
])


def getMaxRate():
    return df['rate'].astype(float).max()


def getMinRate():
    return df['rate'].astype(float).min()


def getMaxCast():
    allData = getAllData()
    casts = {}
    maxName = ''
    maxNum = 0
    for i in allData:
        for j in i[4]:
            if casts.get(j, -1) == -1:
                casts[j] = 1
            else:
                casts[j] = casts[j] + 1
    for k, v in casts.items():
        if int(v) > maxNum:
            maxNum = v
            maxName = k
    return maxName


def getMaxLang():
    allData = getAllData()
    langs = {}
    maxLang = ''
    maxNum = 0
    for i in allData:
        for j in i[9]:
            if langs.get(j, -1) == -1:
                langs[j] = 1
            else:
                langs[j] = langs[j] + 1
    for k, v in langs.items():
        if int(v) > maxNum:
            maxNum = v
            maxLang = k
    return maxLang


def getTypesAll():
    allData = getAllData()
    types = {}
    for i in allData:
        for j in i[7]:
            if types.get(j, -1) == -1:
                types[j] = 1
            else:
                types[j] = types[j] + 1
    return types.keys()


def getType_t():
    allData = getAllData()
    types = {}
    for i in allData:
        for j in i[7]:
            if types.get(j, -1) == -1:
                types[j] = 1
            else:
                types[j] = types[j] + 1
    data = []
    for k, v in types.items():
        data.append({
            'name': k,
            'value': v
        })
    return data


def getRate_t():
    allData = getAllData()
    rates = {}
    for i in allData:
        if rates.get(i[2], -1) == -1:
            rates[i[2]] = 1
        else:
            rates[i[2]] = rates[i[2]] + 1
    return rates.keys(), rates.values()


def getTableList():
    def map_fn(item):
        item[1] = '/'.join(item[1])
        item[4] = '/'.join(item[4])
        item[7] = '/'.join(item[7])
        item[8] = '/'.join(item[8])
        item[9] = '/'.join(item[9])
        return item

    allData = list(getAllData())
    allData = map(map_fn, allData)
    return list(allData)


def getCountryData():
    """获取各国电影数量统计数据"""
    allData = getAllData()
    countries = {}

    for item in allData:
        # item[8] 是 country 字段，已经被处理为列表
        for country in item[8]:
            if country in countries:
                countries[country] += 1
            else:
                countries[country] = 1

    # 转换为 ECharts 需要的格式
    data = [{'name': country, 'value': count} for country, count in countries.items()]
    # 按数量降序排列，取前10个国家，其他归为"其他"
    data.sort(key=lambda x: x['value'], reverse=True)
    if len(data) > 10:
        top_10 = data[:10]
        other_count = sum(item['value'] for item in data[10:])
        top_10.append({'name': '其他', 'value': other_count})
        return top_10
    return data


def getLangData():
    """获取电影语种数量统计数据"""
    allData = getAllData()
    langs = {}

    for item in allData:
        # item[9] 是 lang 字段，已经被处理为列表
        for lang in item[9]:
            if lang in langs:
                langs[lang] += 1
            else:
                langs[lang] = 1

    # 按数量降序排列
    sorted_langs = sorted(langs.items(), key=lambda x: x[1], reverse=True)
    # 取前10种语言
    top_langs = sorted_langs[:10]

    return {
        'langX': [lang for lang, _ in top_langs],  # 语种名称
        'langY': [count for _, count in top_langs]  # 对应数量
    }


def getTypeDistribution():
    """获取电影类型分布数据"""
    allData = getAllData()
    types = {}
    for item in allData:
        # 确保item[7]存在且不为None
        if item[7] is not None:
            for t in item[7]:
                if t and t.strip():  # 确保类型名称不为空字符串
                    if t in types:
                        types[t] += 1
                    else:
                        types[t] = 1

    # 转换为ECharts格式并按数量降序排列
    data = [{'name': t, 'value': count} for t, count in types.items()]
    data.sort(key=lambda x: x['value'], reverse=True)
    return data
